#ifndef SESSIONFRIENDAREA_H
#define SESSIONFRIENDAREA_H

#include <QWidget>
#include <QScrollArea>
#include <QLabel>




////////////////////////////
/// 滚动区域中Item的类型
///////////////////////////
enum ItemType
{
    SessionItemType,
    FriendItemType,
    ApplyItemType
};


////////////////////////////////
///整个滚动区域的实现
//////////////////////////////
class SessionFriendArea : public QScrollArea
{
    Q_OBJECT
public:
    explicit SessionFriendArea(QWidget *parent = nullptr);
    //清空该区域中所有Item
    void clear();

    //添加一个Item到该区域中,itemType表示添加哪种item, id跟着不同的itemType有不同的含义。
    //如果是SessionItem, id 就是 chatSessionId.
    //如果是FriendItem / ApplyItem, id就是userId.
    void addItem(ItemType itemType, const QString& id, const QIcon& avatar, const QString& name, const QString& text);

    //选中某个指定的 item,通过index下标选择
    void clickItem(int index);


private:
    //后续往 container 内部的 layout 中添加元素, 就能够触发 QScrollArea 的滚动效果
    QWidget* container;
signals:
};




////////////////////////////
/// 滚动区域Item 的实现
///////////////////////////


class SessionFriendItem : public QWidget
{
    Q_OBJECT

public:
    //使Item下的控件背景色与Widget一样
    SessionFriendItem(QWidget* owner, const QIcon& avatar, const QString& name, const QString& text);
    //调整背景色为Widget的颜色
    void paintEvent(QPaintEvent* event) override;
    //鼠标点击改变颜色
    void mousePressEvent(QMouseEvent* event) override;
    //鼠标进入改变颜色
    void enterEvent(QEnterEvent* event) override;
    //鼠标离开改变颜色
    void leaveEvent(QEvent* event)override;
    //改变颜色封装
    void select();
    //active实现Item被点击后的业务逻辑
    virtual void active();


private:
    //owner 指向以上的SessionFriendArea对象
    QWidget* owner;

    //变量用来表示当前 Item是否被选中
    bool selected = false;
protected:
     QLabel* messageLabel;

};

////////////////////////////
/// 会话Item 的实现
///////////////////////////

class SessionItem : public SessionFriendItem
{
    Q_OBJECT
public:
    SessionItem(QWidget* owner, const QString& chatSessionId, const QIcon& avatar, const QString& name, const QString& lastMessage);
    virtual void active() override;

    void updateLastMessage(const QString& chatSessionId);
private:
    //当前会话id
    QString chatSessionId;

    //最后一条消息的文本预览
    QString text;
};


////////////////////////////
/// 好友Item 的实现
///////////////////////////

class FriendItem : public SessionFriendItem
{
    Q_OBJECT

public:
    FriendItem(QWidget* owner, const QString& userId, const QIcon& avatar, const QString& name,
                      const QString& description);
    virtual void active() override;
private:
    //好友的用户id
    QString userId;

};


////////////////////////////
/// 好友申请Item 的实现
///////////////////////////

class ApplyItem : public SessionFriendItem
{
public:
    //此处不需要显示附加文本,比上面两个Item的构造函数少了一个参数
    ApplyItem(QWidget* owner, const QString& userId, const QIcon& avatar, const QString& name);
    virtual void active() override;
    void acceptFriendApply();
    void rejectFriendApply();
private:
    //申请人的useId
    QString userId;
};

#endif // SESSIONFRIENDAREA_H
